package com.beauty.product.controller;

import com.beauty.product.dto.CategoryDto;
import com.beauty.product.result.Result;
import com.beauty.product.service.CategoryService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 商品分类控制器
 * <p>
 * 该控制器负责处理与商品分类相关的所有HTTP请求，包括分类的创建、查询、更新、删除等操作。
 * 同时提供分类树结构的获取，以及根据层级、父分类等条件查询分类的功能。
 * </p>
 * 
 * @author beauty-dev
 * @version 1.0
 */
@RestController
@RequestMapping("/api/category")
@RequiredArgsConstructor
public class CategoryController {
    
    /**
     * 分类服务，提供分类的核心业务逻辑处理
     */
    private final CategoryService categoryService;
    
    /**
     * 创建新分类
     * 
     * @param categoryDto 分类数据传输对象，包含分类的详细信息
     * @return 返回创建成功的分类信息
     */
    @PostMapping
    public Result<CategoryDto> createCategory(@Valid @RequestBody CategoryDto categoryDto) {
        return Result.success(categoryService.createCategory(categoryDto));
    }
    
    /**
     * 根据ID获取分类详情
     * 
     * @param id 分类ID
     * @return 返回指定ID的分类详细信息
     */
    @GetMapping("/{id}")
    public Result<CategoryDto> getCategoryById(@PathVariable Long id) {
        return Result.success(categoryService.getCategoryById(id));
    }
    
    /**
     * 根据分类名称获取分类详情
     * 
     * @param name 分类名称
     * @return 返回指定名称的分类详细信息
     */
    @GetMapping("/name/{name}")
    public Result<CategoryDto> getCategoryByName(@PathVariable String name) {
        return Result.success(categoryService.getCategoryByName(name));
    }
    
    /**
     * 获取所有根分类
     * <p>
     * 根分类是指没有父分类的顶级分类
     * </p>
     * 
     * @return 返回所有根分类列表
     */
    @GetMapping("/root")
    public Result<List<CategoryDto>> getRootCategories() {
        return Result.success(categoryService.getRootCategories());
    }
    
    /**
     * 获取指定父分类下的所有子分类
     * 
     * @param parentId 父分类ID
     * @return 返回指定父分类下的所有子分类列表
     */
    @GetMapping("/sub/{parentId}")
    public Result<List<CategoryDto>> getSubcategories(@PathVariable Long parentId) {
        return Result.success(categoryService.getSubcategories(parentId));
    }
    
    /**
     * 获取指定层级的所有分类
     * 
     * @param level 分类层级，1表示一级分类，2表示二级分类，以此类推
     * @return 返回指定层级的所有分类列表
     */
    @GetMapping("/level/{level}")
    public Result<List<CategoryDto>> getCategoriesByLevel(@PathVariable Integer level) {
        return Result.success(categoryService.getCategoriesByLevel(level));
    }
    
    /**
     * 获取所有分类列表
     * <p>
     * 返回扁平化的分类列表，不包含层级关系
     * </p>
     * 
     * @return 返回所有分类的列表
     */
    @GetMapping
    public Result<List<CategoryDto>> getAllCategories() {
        return Result.success(categoryService.getAllCategories());
    }
    
    /**
     * 获取分类树结构
     * <p>
     * 返回完整的分类树结构，包含父子关系，从根分类开始
     * </p>
     * 
     * @return 返回分类树结构
     */
    @GetMapping("/tree")
    public Result<List<CategoryDto>> getCategoryTree() {
        return Result.success(categoryService.getCategoryTree());
    }
    
    /**
     * 更新分类信息
     * 
     * @param id 分类ID
     * @param categoryDto 更新的分类信息
     * @return 返回更新后的分类详情
     */
    @PutMapping("/{id}")
    public Result<CategoryDto> updateCategory(@PathVariable Long id, @Valid @RequestBody CategoryDto categoryDto) {
        return Result.success(categoryService.updateCategory(id, categoryDto));
    }
    
    /**
     * 删除分类
     * <p>
     * 如果分类下有子分类，可能会导致删除失败
     * </p>
     * 
     * @param id 要删除的分类ID
     * @return 返回操作结果
     */
    @DeleteMapping("/{id}")
    public Result<Void> deleteCategory(@PathVariable Long id) {
        categoryService.deleteCategory(id);
        return Result.success();
    }
} 